
# ===================================================================
# 0. BEÁLLÍTÁSOK ÉS SZÜKSÉGES CSOMAGOK TELEPÍTÉSE/BETÖLTÉSE
# ===================================================================

required_packages <- c("readxl", "writexl", "dplyr", "stringr", "udpipe")
new_packages <- required_packages[!(required_packages %in% installed.packages()[,"Package"])]
if(length(new_packages)) {
  install.packages(new_packages, dependencies = TRUE)
}
lapply(required_packages, library, character.only = TRUE)
message("Minden szükséges R csomag betöltve.")


# ===================================================================
# 1. UDPIPE MODELL ÉS KIVÉTEL SZÓTÁR BETÖLTÉSE
# ===================================================================

# -- UDpipe Modell --
model_name <- "hungarian-szeged-ud-2.5-191206.udpipe"
if (!file.exists(model_name)) {
  message("A magyar UDpipe modell letöltése...")
  udpipe_download_model(language = "hungarian-szeged")
}
ud_model <- udpipe_load_model(file = model_name)
message("A magyar UDpipe modell sikeresen betöltve.")

# -- Kivétel Szótár Betöltése --
exception_file <- "kivetel_szotar.xlsx"
if (file.exists(exception_file)) {
  exception_dict <- read_excel(exception_file) %>%
    mutate(raw_phrase_clean = str_squish(str_to_lower(raw_phrase))) # Tisztított kulcs a párosításhoz
  message("Kivétel szótár sikeresen betöltve.")
} else {
  exception_dict <- data.frame(raw_phrase_clean = character(), manual_lemma = character())
  warning("Figyelem: 'kivetel_szotar.xlsx' nem található. A szkript csak automatikus lemmatizálást fog végezni.")
}


# ===================================================================
# 2. ADATOK BEOLVASÁSA
# ===================================================================

input_file <- "nyers_adatok.xlsx" 
raw_data <- read_excel(input_file, guess_max = 1000)
message(paste("Az adatok beolvasva a(z)", input_file, "fájlból."))


# ===================================================================
# 3. HIBRID TISZTÍTÓ ÉS LEMMATIZÁLÓ FÜGGVÉNY (VÉGLEGES, ZAJ-SZŰRÉSSEL)
# ===================================================================

process_column_hybrid <- function(column_vector) {
  
  # Adatkeret létrehozása az eredeti adatokkal és egyedi sorazonosítóval
  original_df <- data.frame(
    doc_id = 1:length(column_vector),
    original_text = as.character(column_vector)
  ) %>%
    mutate(
      # Tisztított kulcs létrehozása a párosításhoz
      raw_phrase_clean = str_squish(str_to_lower(original_text))
    )
  
  # Bal oldali illesztés a kivétel szótárral
  joined_df <- left_join(original_df, exception_dict, by = "raw_phrase_clean")
  
  # Szétválasztjuk az adatokat
  manual_part <- joined_df %>% filter(!is.na(manual_lemma))
  auto_part <- joined_df %>% filter(is.na(manual_lemma))
  
  final_lemmas <- character(nrow(original_df))
  
  # --- MANUÁLIS RÉSZ FELDOLGOZÁSA ---
  if(nrow(manual_part) > 0) {
    cleaned_manual_lemmas <- manual_part$manual_lemma %>%
      str_to_lower() %>%
      str_remove_all("[[:punct:]]|-") %>%
      str_remove_all("[[:digit:]]") %>%
      str_squish()
    
    final_lemmas[manual_part$doc_id] <- cleaned_manual_lemmas
  }
  
  # --- AUTOMATIKUS RÉSZ FELDOLGOZÁSA ---
  if(nrow(auto_part) > 0) {
    
    texts_to_process <- auto_part$original_text
    non_empty_indices <- which(texts_to_process != "" & !is.na(texts_to_process))
    
    if(length(non_empty_indices) > 0) {
      
      texts_to_process_cleaned <- texts_to_process[non_empty_indices] %>%
        str_to_lower() %>%
        str_remove_all("[[:punct:]]|-") %>%
        str_remove_all("[[:digit:]]") %>%
        # *** ÚJ SOR: Ismétlődő karakterekből álló szavak törlése ***
        str_remove_all("\\b(.)\\1{2,}\\b") %>% 
        str_squish()
      
      annotated_text <- udpipe_annotate(ud_model, 
                                        x = texts_to_process_cleaned, 
                                        doc_id = non_empty_indices)
      
      lemmas_df <- as.data.frame(annotated_text) %>%
        mutate(final_word = case_when(
          upos %in% c("NOUN", "VERB", "ADJ") ~ lemma,
          TRUE                               ~ tolower(token)
        ))
      
      lemmatized_results <- lemmas_df %>%
        group_by(doc_id) %>%
        summarise(lemma_text = paste(final_word, collapse = " ")) %>%
        ungroup() %>%
        mutate(
          lemma_text = str_replace_all(lemma_text, "\\b[a-záéíóöőúüű]+\\b", 
                                       function(word) { if(nchar(word) > 1) word else "" }),
          lemma_text = str_squish(lemma_text)
        )
      
      original_indices <- auto_part$doc_id[as.numeric(lemmatized_results$doc_id)]
      final_lemmas[original_indices] <- lemmatized_results$lemma_text
    }
  }
  
  return(final_lemmas)
}

# ===================================================================
# 4. A FÜGGVÉNY ALKALMAZÁSA AZ ADATOKRA
# ===================================================================
message("Hibrid lemmatizálás folyamatban... Ez eltarthat egy ideig.")

lemmatized_data <- raw_data %>%
  mutate(across(starts_with("fog"), 
                process_column_hybrid, 
                .names = "{.col}_lemma"))

message("A lemmatizálás befejeződött.")


# ===================================================================
# 5. AZ EREDMÉNYEK MENTÉSE EXCEL FÁJLBA
# ===================================================================

output_file <- "lemmatizalt_adatok_hibrid.xlsx"
write_xlsx(lemmatized_data, path = output_file)

message(paste("A feldolgozás kész! Az eredményeket a(z)", output_file, "fájlba mentettük."))

# --- A SZKRIPT VÉGE ---

